import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
import os

# 设置中文字体以确保图表中的中文能正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

# 创建结果文件夹
results_dir = "c:\\Users\\YEDX\\task\\第六章作业\\analysis_results"
os.makedirs(results_dir, exist_ok=True)

# 第一步：数据加载和清洗
def load_and_clean_data(file_path):
    """
    加载并清洗美元指数期货历史数据
    """
    print("正在加载和清洗数据...")
    # 读取CSV文件
    df = pd.read_csv(file_path)
    
    # 查看数据基本信息
    print(f"原始数据形状: {df.shape}")
    print(f"\n数据基本信息:")
    print(df.info())
    
    # 解析日期列
    df['日期'] = pd.to_datetime(df['日期'], format='%Y年%m月%d日')
    
    # 处理数字列中的非数字字符
    # 转换交易量列（去除'K'并转换为数字）
    df['交易量'] = df['交易量'].str.replace('K', '').astype(float) * 1000
    
    # 转换涨跌幅列（去除'%'并转换为数字）
    df['涨跌幅'] = df['涨跌幅'].str.replace('%', '').astype(float)
    
    # 重命名列以便于分析
    df.columns = ['date', 'close', 'open', 'high', 'low', 'volume', 'change_pct']
    
    # 按日期排序（从早到晚）
    df = df.sort_values('date')
    
    # 重置索引
    df = df.reset_index(drop=True)
    
    print(f"\n清洗后的数据形状: {df.shape}")
    print(f"\n数据样本:")
    print(df.head())
    
    # 保存清洗后的数据
    cleaned_file = os.path.join(results_dir, 'cleaned_dollar_index_data.csv')
    df.to_csv(cleaned_file, index=False, encoding='utf-8-sig')
    print(f"\n清洗后的数据已保存至: {cleaned_file}")
    
    return df

# 第二步：基础统计分析
def basic_statistical_analysis(df):
    """
    对美元指数期货数据进行基础统计分析
    """
    print("\n正在进行基础统计分析...")
    
    # 基础统计描述
    stats = df.describe()
    print("\n基础统计描述:")
    print(stats)
    
    # 保存统计结果
    stats_file = os.path.join(results_dir, 'basic_statistics.txt')
    with open(stats_file, 'w', encoding='utf-8') as f:
        f.write("美元指数期货数据基础统计分析\n")
        f.write("="*50 + "\n\n")
        f.write(f"数据时间范围: {df['date'].min().strftime('%Y-%m-%d')} 至 {df['date'].max().strftime('%Y-%m-%d')}\n")
        f.write(f"数据总条数: {len(df)}\n\n")
        f.write("统计描述:\n")
        f.write(str(stats))
    
    # 计算额外的统计指标
    additional_stats = {
        '平均日涨跌幅': df['change_pct'].mean(),
        '涨跌幅标准差': df['change_pct'].std(),
        '上涨天数': (df['change_pct'] > 0).sum(),
        '下跌天数': (df['change_pct'] < 0).sum(),
        '平盘天数': (df['change_pct'] == 0).sum(),
        '最大单日涨幅': df['change_pct'].max(),
        '最大单日跌幅': df['change_pct'].min(),
        '平均交易量': df['volume'].mean(),
        '总交易量': df['volume'].sum()
    }
    
    print("\n额外统计指标:")
    for key, value in additional_stats.items():
        print(f"{key}: {value}")
    
    # 追加额外统计指标到文件
    with open(stats_file, 'a', encoding='utf-8') as f:
        f.write("\n\n额外统计指标:\n")
        f.write("-"*30 + "\n")
        for key, value in additional_stats.items():
            f.write(f"{key}: {value}\n")
    
    print(f"\n统计分析结果已保存至: {stats_file}")
    
    return stats, additional_stats

# 第三步：可视化分析
def visualize_analysis(df):
    """
    对美元指数期货数据进行可视化分析
    """
    print("\n正在进行可视化分析...")
    
    # 1. 收盘价走势图
    plt.figure(figsize=(12, 6))
    plt.plot(df['date'], df['close'], marker='o', markersize=3, linestyle='-', color='blue')
    plt.title('美元指数期货收盘价走势 (2024年1月-5月)')
    plt.xlabel('日期')
    plt.ylabel('收盘价')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    close_price_file = os.path.join(results_dir, 'close_price_trend.png')
    plt.savefig(close_price_file, dpi=300)
    plt.close()
    print(f"收盘价走势图已保存至: {close_price_file}")
    
    # 2. 涨跌幅分布直方图
    plt.figure(figsize=(10, 6))
    plt.hist(df['change_pct'], bins=20, alpha=0.7, color='green', edgecolor='black')
    plt.title('美元指数期货涨跌幅分布')
    plt.xlabel('涨跌幅 (%)')
    plt.ylabel('频数')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    change_dist_file = os.path.join(results_dir, 'change_percent_distribution.png')
    plt.savefig(change_dist_file, dpi=300)
    plt.close()
    print(f"涨跌幅分布直方图已保存至: {change_dist_file}")
    
    # 3. 交易量柱状图
    plt.figure(figsize=(12, 6))
    plt.bar(df['date'], df['volume'], alpha=0.7, color='orange')
    plt.title('美元指数期货交易量变化')
    plt.xlabel('日期')
    plt.ylabel('交易量')
    plt.grid(True, alpha=0.3, axis='y')
    plt.tight_layout()
    volume_file = os.path.join(results_dir, 'trading_volume.png')
    plt.savefig(volume_file, dpi=300)
    plt.close()
    print(f"交易量柱状图已保存至: {volume_file}")
    
    # 4. K线图（简化版）
    plt.figure(figsize=(12, 6))
    # 绘制高低点连线
    for i in range(len(df)):
        plt.plot([df['date'].iloc[i], df['date'].iloc[i]], 
                 [df['low'].iloc[i], df['high'].iloc[i]], 
                 color='black')
    # 绘制开盘收盘蜡烛
    for i in range(len(df)):
        if df['close'].iloc[i] >= df['open'].iloc[i]:
            color = 'red'  # 上涨为红色
        else:
            color = 'green'  # 下跌为绿色
        plt.bar(df['date'].iloc[i], 
                abs(df['close'].iloc[i] - df['open'].iloc[i]), 
                bottom=min(df['open'].iloc[i], df['close'].iloc[i]),
                color=color, width=0.6)
    
    plt.title('美元指数期货K线图 (简化版)')
    plt.xlabel('日期')
    plt.ylabel('价格')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    kline_file = os.path.join(results_dir, 'k_line_chart.png')
    plt.savefig(kline_file, dpi=300)
    plt.close()
    print(f"K线图已保存至: {kline_file}")
    
    # 5. 价格波动率分析
    df['price_change'] = df['close'].pct_change() * 100  # 计算日收益率
    df['volatility'] = df['price_change'].rolling(window=5).std()  # 5日滚动波动率
    
    plt.figure(figsize=(12, 6))
    plt.plot(df['date'], df['volatility'], marker='', linestyle='-', color='purple')
    plt.title('美元指数期货5日滚动波动率')
    plt.xlabel('日期')
    plt.ylabel('波动率 (%)')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    volatility_file = os.path.join(results_dir, 'volatility_analysis.png')
    plt.savefig(volatility_file, dpi=300)
    plt.close()
    print(f"波动率分析图已保存至: {volatility_file}")
    
    # 6. 月度表现对比
    df['month'] = df['date'].dt.month
    monthly_stats = df.groupby('month').agg({
        'close': ['first', 'last', 'mean', 'std'],
        'volume': 'mean',
        'change_pct': 'mean'
    })
    
    # 计算月度收益率
    monthly_stats['monthly_return'] = ((monthly_stats[('close', 'last')] / monthly_stats[('close', 'first')]) - 1) * 100
    
    plt.figure(figsize=(10, 6))
    months = ['1月', '2月', '3月', '4月', '5月']
    plt.bar(range(1, 6), monthly_stats['monthly_return'], color=['blue', 'green', 'red', 'purple', 'orange'])
    plt.title('美元指数期货月度收益率对比')
    plt.xlabel('月份')
    plt.ylabel('收益率 (%)')
    plt.xticks(range(1, 6), months)
    plt.grid(True, alpha=0.3, axis='y')
    plt.tight_layout()
    monthly_return_file = os.path.join(results_dir, 'monthly_return_comparison.png')
    plt.savefig(monthly_return_file, dpi=300)
    plt.close()
    print(f"月度收益率对比图已保存至: {monthly_return_file}")
    
    # 保存月度统计结果
    monthly_stats_file = os.path.join(results_dir, 'monthly_statistics.csv')
    monthly_stats.to_csv(monthly_stats_file, encoding='utf-8-sig')
    print(f"月度统计结果已保存至: {monthly_stats_file}")

# 第四步：相关性分析
def correlation_analysis(df):
    """
    对美元指数期货数据进行相关性分析
    """
    print("\n正在进行相关性分析...")
    
    # 选择数值列进行相关性分析
    numeric_cols = ['close', 'open', 'high', 'low', 'volume', 'change_pct']
    correlation_matrix = df[numeric_cols].corr()
    
    print("\n相关性矩阵:")
    print(correlation_matrix)
    
    # 保存相关性矩阵
    corr_file = os.path.join(results_dir, 'correlation_matrix.csv')
    correlation_matrix.to_csv(corr_file, encoding='utf-8-sig')
    
    # 绘制相关性热力图
    plt.figure(figsize=(10, 8))
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1, fmt='.2f')
    plt.title('美元指数期货数据相关性热力图')
    plt.tight_layout()
    heatmap_file = os.path.join(results_dir, 'correlation_heatmap.png')
    plt.savefig(heatmap_file, dpi=300)
    plt.close()
    
    print(f"相关性矩阵已保存至: {corr_file}")
    print(f"相关性热力图已保存至: {heatmap_file}")

# 主函数
def main():
    """
    主函数，执行完整的美元指数期货数据分析流程
    """
    print("="*60)
    print("          美元指数期货历史数据分析")
    print("="*60)
    
    # 数据文件路径
    file_path = "c:\\Users\\YEDX\\task\\第六章作业\\美元指数期货历史数据.csv"
    
    try:
        # 1. 数据加载和清洗
        df = load_and_clean_data(file_path)
        
        # 2. 基础统计分析
        stats, additional_stats = basic_statistical_analysis(df)
        
        # 3. 可视化分析
        visualize_analysis(df)
        
        # 4. 相关性分析
        correlation_analysis(df)
        
        print("\n" + "="*60)
        print("数据分析完成！所有结果已保存至 analysis_results 文件夹")
        print("="*60)
        
    except Exception as e:
        print(f"\n分析过程中出现错误: {str(e)}")

if __name__ == "__main__":
    main()